package com.blog.cmrpersonalblog.dto.announcement.request;

import lombok.Data;
import jakarta.validation.constraints.*;
import java.time.LocalDateTime;

/**
 * 公告更新请求DTO
 */
@Data
public class AnnouncementUpdateRequest {

    /**
     * 公告ID
     */
    @NotNull(message = "公告ID不能为空")
    private Long id;

    /**
     * 公告标题
     */
    @Size(max = 200, message = "公告标题长度不能超过200个字符")
    private String title;

    /**
     * 公告内容
     */
    @Size(max = 10000, message = "公告内容长度不能超过10000个字符")
    private String content;

    /**
     * 公告类型 1-系统公告 2-活动公告 3-维护公告 4-其他
     */
    @Min(value = 1, message = "公告类型最小值为1")
    @Max(value = 4, message = "公告类型最大值为4")
    private Integer type;

    /**
     * 公告级别 1-普通 2-重要 3-紧急
     */
    @Min(value = 1, message = "公告级别最小值为1")
    @Max(value = 3, message = "公告级别最大值为3")
    private Integer level;

    /**
     * 公告状态 0-草稿 1-已发布 2-已过期
     */
    @Min(value = 0, message = "公告状态最小值为0")
    @Max(value = 2, message = "公告状态最大值为2")
    private Integer status;

    /**
     * 是否置顶 0-否 1-是
     */
    private Integer isTop;

    /**
     * 是否弹窗显示 0-否 1-是
     */
    private Integer isPopup;

    /**
     * 目标受众 all-所有用户 admin-管理员 user-普通用户
     */
    @Pattern(regexp = "^(all|admin|user)$", message = "目标受众只能是all、admin或user")
    private String targetAudience;

    /**
     * 发布时间
     */
    private LocalDateTime publishTime;

    /**
     * 过期时间
     */
    private LocalDateTime expireTime;

    /**
     * 更新人ID（由系统自动设置）
     */
    private Long updaterId;

    /**
     * 更新人姓名（由系统自动设置）
     */
    private String updaterName;

    /**
     * 验证发布时间和过期时间的逻辑关系
     */
    @AssertTrue(message = "过期时间必须晚于发布时间")
    public boolean isValidTimeRange() {
        if (publishTime != null && expireTime != null) {
            return expireTime.isAfter(publishTime);
        }
        return true;
    }
}
